/**
 * @file Cmd.cpp
 * @author BadFatCat0919 (543015378@qq.com)
 * @brief 指令类
 */

#include "Cmd.h"

/**
 * @brief 创建前往指令
 * @param x 前往格子的横坐标
 * @param y 前往格子的纵坐标
 * @param dir 这一步的运动方向
 * @param isEmpty 是否为空载
 * @return Cmd 创建的指令
 */
Cmd Cmd::createRunTo(int x, int y, int dir, bool isEmpty) {
    return Cmd(RUN_TO, x, y, dir);
}

/**
 * @brief 创建购买指令
 * @param bench 购买工作台
 * @return Cmd 创建的指令
 */
Cmd Cmd::createBuy(void *bench) {
    return Cmd(BUY, bench);
}

/**
 * @brief 创建出售指令
 * @param bench 出售工作台
 * @param type 货物类型
 * @return Cmd 创建的指令
 */
Cmd Cmd::createSell(void *bench, int type) {
    return Cmd(SELL, type, 0, 0, bench);
}

/**
 * @brief 创建销毁指令
 * @return Cmd 创建的指令
 */
Cmd Cmd::createDestroy() {
    return Cmd(DESTROY);
}

/**
 * @brief 创建等待指令
 * @param waitFrames 等待帧数
 * @return Cmd 创建的指令
 */
Cmd Cmd::createWait(int waitFrames) {
    return Cmd(WAIT, waitFrames);
}

/**
 * @brief 创建避让指令
 * @param x 避让点的横坐标
 * @param y 避让点的纵坐标
 * @param dispatcher 避让的调度器
 * @param minSteps 最少检查指令数
 * @return Cmd 创建的指令
 */
Cmd Cmd::createAvoid(int x, int y, void *dispatcher, int minSteps) {
    return Cmd(AVOID, x, y, minSteps, dispatcher);
}

/**
 * @brief 判等
 * @param another 待判值
 * @return true 相等
 * @return false 不等
 */
bool Cmd::operator==(const Cmd &another) {
    if(this->type != another.type) {
        return false;
    }
    if((this->type == RUN_TO || this->type == WAIT) && this->data1 != another.data1) {
        return false;
    }
    if(this->type == RUN_TO && (this->data2 != another.data2 || this->data3 != another.data3)) {
        return false;
    }
    return true;
}

/**
 * @brief 判不等
 * @param another 待判值
 * @return true 不等
 * @return false 相等
 */
bool Cmd::operator!=(const Cmd &another) {
    return !(*this == another);
}
